# 数据分析
import pandas as pd
import numpy as np
# 绘图
import matplotlib.pyplot as plt
import seaborn as sns
import zipfile
import os

df_train = pd.read_csv('./titanic_data/train.csv')
df_test = pd.read_csv('./titanic_data/test.csv')
print(df_train.info())
# 查看训练集详细信息
print(df_train.describe())

print(df_test.info())
# 查看测试集详细信息
print(df_test.describe())

# 填充数据值
def fillna_data(df_train, df_test):
    # 对训练集和测试集中的"Age"数据进行平均值填充
    df_train['Age'] = df_train['Age'].fillna(df_train['Age'].mean())
    df_test['Age'] = df_test['Age'].fillna(df_test['Age'].mean())
    # 添加一个新的类别"Missing"来填充"Cabin"
    df_train['Cabin'] = df_train['Cabin'].fillna('Missing')
    df_test['Cabin'] = df_test['Cabin'].fillna('Missing')
    # 用出现频率最多的类别填充训练集中的"Embarked"属性
    df_train['Embarked'] = df_train['Embarked'].fillna(
        df_train['Embarked'].mode()[0])
    # 用出现频率最多的类别填充测试集中的"Fare"属性
    df_test['Fare'] = df_test['Fare'].fillna(
        df_test['Fare'].mode()[0])

    return df_train, df_test

# 得到填充后的数据集 df_train， df_test
df_train, df_test = fillna_data(df_train, df_test)

#分析各船舱的存活率
sns.barplot(x='Pclass', y='Survived', data=df_train,
            palette="Set1",
            errwidth=1.2,
            errcolor="0.1",
            capsize=0.05,
            alpha=0.6)
plt.show()
# 分析性别与存活率
sns.barplot(x='Sex', y='Survived', data=df_train,
            capsize=0.05,
            errwidth=1.2,
            errcolor='0.1',
            alpha=0.6)
plt.show()
# 分析年龄与性别与存活率
# 绘制不同年龄与性别的存活率
women = df_train[df_train["Sex"] == "female"]
men = df_train[df_train["Sex"] == "male"]

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))

ax = sns.distplot(men[men['Survived'] == 1].Age,
                  label='Survived', ax=axes[0], kde=False)
ax.set_title('Male')

_ax = sns.distplot(women[women['Survived'] == 1].Age,
                   label='Survived', ax=axes[1], kde=False)
_ax.set_title('Female')

plt.show()

#分析乘客家属数量与存活率的关系
# 创建1行2列，大小为10*4的画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))
# 乘客在船上的兄弟姐妹和父母小孩的数量与存活率的关系
ax = sns.lineplot(x='SibSp', y='Survived', data=df_train,
                  ax=axes[0], label='SibSp')
ax = sns.lineplot(x='Parch', y='Survived', data=df_train,
                  ax=axes[0], label='Parch')
# 将两个属性相加，更加方便分析
relatives = df_train['SibSp'] + df_train['Parch']
# 乘客在船上的亲属的数量与存活率的关系
_ax = sns.lineplot(x=relatives, y=df_train['Survived'],
                   ax=axes[1], label='Relatives')
plt.show()

#分析登船港口与存活率的关系
# 统计登船港口的分类值
print(df_train['Embarked'].value_counts())
# 绘制各个港口登船的乘客的生存率
sns.pointplot(x='Embarked', y='Survived', data=df_train, order=None)
plt.show()

#分析登船港口与性别与存活率的关系
g = sns.FacetGrid(df_train, col='Embarked')
g.map(sns.barplot, 'Sex', 'Survived', data=df_train,
      palette="Set1",
      capsize=0.05,
      errwidth=1.2,
      errcolor='0.1',
      alpha=0.6,
      order=None)
# 添加图例
g.add_legend()
plt.show()

'''
# 去除无关特征
id_test = df_test.loc[:, 'PassengerId'] # 保留测试集的乘客ID
# 第一次处理
# 去掉了以下特征
# 即对 Pclass Sex Age SibSp Parch Embarked 分析
df_train = df_train.drop(columns=['PassengerId', 'Name', 'Ticket', 'Cabin', 'Fare'])
df_test = df_test.drop(columns=['PassengerId', 'Name', 'Ticket', 'Cabin', 'Fare'])

# 第二次处理
# 在第一次的基础上，添加了归一化处理的特征 Fare
# 即对 Pclass Sex Age SibSp Parch Fare Embarked 分析
df_train = df_train.drop(columns=['PassengerId', 'Name', 'Ticket', 'Cabin'])
df_test = df_test.drop(columns=['PassengerId', 'Name', 'Ticket', 'Cabin'])

# 第三次处理
# 在第二次的基础上，去掉了特征 SibSp Parch
df_train = df_train.drop(columns=['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp', 'Parch'])
df_test = df_test.drop(columns=['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp', 'Parch'])

'''